<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>递归深入</title>
</head>
<body>
    <script type="text/javascript">
    	document.write('算法储备之递归深入')

//1.题目：输出斐波那契数列的前十项，即1，1，2，3，5，8，13，21，34，55。然后请思考代发是否有大量的重复运算？应该如何解决？

//总结：递归思想是在规则重复的情况下使用

		 	

		        //写一个函数返回下标为n的值
		        // function fib(n){
		        // 	if(n==1 || n==0 ){
		        // 		return 1
		        // 	}
		        // 	return  fib(n-1)+fib(n-2)
		        // };
		        // console.log(fib(4))

		        //缓存对象
		        let cache ={};
		        function fib(n){
		        	console.log('进入了fib函数：',n)
		        	console.count('计数');
		        	// 判断缓存中有没有这个值，如果有就直接用
		        	if(cache.hasOwnProperty(n)){
		        		console.log('命中缓存=》',n,cache)
		        		return cache[n]
		        	}
		        	var v = n==1 || n==0 ? 1 :fib(n-1)+fib(n-2);
		        	//写入缓存
		        	cache[n] = v;
		        	return v
		        }
		        // console.log(fib(10))
		        // for(let i=0;i<9;i++){
		        // 	console.log(fib(i))
		        // }



                //数组方法
		        let arr =[1,1];
		        while(arr.length<=10){
		        	arr.push(arr[arr.length-1]+arr[arr.length-2])
		        };
		        // console.log(arr)





		        // 2.题目：将这个高维数组[1,2,[3,[4,5],6],7]转换成下面这个格式
		        // {
		        // 	children:[
		        // 	   {value:1},
		        // 	   {value:2},
		        // 	   {
		        // 	   	children:[
		        // 	   	   {value:3},
		        // 	   	   {
		        // 	   	   	children:[
		        // 	   	   	   {value:4},
		        // 	   	   	   {value:5}
		        // 	   	   	]
		        // 	   	   },
		        // 	   	   {value:6},
		        // 	   	]
		        // 	   },
		        // 	   {value:7},
		        // 	]
		        // }


		        let arr2 = [1,2,[3,[4,5],6],7];

		        // 转换函数1:
		        function convert(arr){
		        	//结果数组
		        	let result = [];
		        	//遍历arr的每一项
		        	arr.forEach((item,index)=>{
		        		if(typeof item =='number'){
		        			result.push({
		        				value:item
		        			})
		        		}else if(Array.isArray(item)){
		        			result.push({
		        				children:convert(item)
		        			})
		        		};
		        		
		        	})
		        	return result
		        };
		        // console.log(convert(arr2))





		        // 转换函数2:在这个函数中的参数item可能是数字也可能是数组，写法1中的递归次数要多大小于写法2，因为写法2中每一个都要递归一次
		        function convert2(item){
		        	if(typeof item =='number'){
		        		return {
		        			value:item
		        		}
		        	}else if(Array.isArray(item)){
		        			return {
		        				children:item.map(_item=>convert2(_item))
		        			}
		        	};
		        	// return res
		        }
		         console.log(convert2(arr2))












    </script>
</body>
</html>